package com.sky.service;

import com.sky.dto.OrdersPageQueryDTO;
import com.sky.dto.OrdersPaymentDTO;
import com.sky.dto.OrdersRejectionDTO;
import com.sky.dto.OrdersSubmitDTO;
import com.sky.entity.Orders;
import com.sky.result.PageResult;
import com.sky.vo.OrderPaymentVO;
import com.sky.vo.OrderStatisticsVO;
import com.sky.vo.OrderSubmitVO;
import com.sky.vo.OrderVO;

/**
 * PROJECT_NAME: sky-take-out
 * NAME: OrdersService
 * USER: zhang
 * DATE: 2023/5/28
 * DESCRIPTION :C端-订单信息表现层接口
 */
public interface OrdersService {
    /**
     * 用户下单功能
     *
     * @param ordersSubmitDTO 订单基本信息
     * @return 全局通用返回信息Bean(订单id + 订单号 + 订单金额 + 下单时间)
     */
    OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO);

    /**
     * 用户请求支付功能
     *
     * @param ordersPaymentDTO 用于请求支付相关信息(订单号码/付款方式)
     * @return 微信支付基础信息VO
     */
    OrderPaymentVO pay(OrdersPaymentDTO ordersPaymentDTO) throws Exception;

    /**
     * 支付成功功能(更改订单状态)
     * @param outTradeNo 订单编号
     */
    void paySuccess(String outTradeNo);
    /**
     * 历史订单查询
     * @param ordersPageQueryDTO 查询参数(页码+页数+状态)
     * @return 全局通用返回信息Bean(总条数+OrderVO的List集合)
     */
    PageResult selectHistoryOrders(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 查询订单详情
     * @param orderId 订单Id
     * @return 全局通用返回信息Bean(订单基本信息+订单详细信息)
     */
    OrderVO selectOrderDetails(Long orderId);

    /**
     * 取消订单
     * @param orderId 订单Id
     */
    void cancelOrder(Long orderId);

    /**
     * 再来一单
     * @param orderId 订单Id
     */
    void repetitionOrder(Long orderId);

    /**
     * 订单搜索
     * @param ordersPageQueryDTO 搜索条件参数
     * @return 全局通用返回信息Bean(总条数+OrderVO)
     */
    PageResult selectOrderByCondition(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 不同状态订单统计功能
     * @return 全局通用返回信息
     */
    OrderStatisticsVO statisticsOrder();

    /**
     * 查询订单详情
     * @param orderId 订单Id
     * @return 全局通用返回信息Bean(订单信息+订单详情)
     */
    OrderVO selectOrderVO(Long orderId);

    /**
     * 接单
     * @param orders 订单基本信息
     */
    void confirmOrder(Orders orders);

    /**
     * 拒单
     * @param ordersRejectionDTO 拒绝订单DTO(订单Id+拒单原因)
     */
    void rejectionOrder(OrdersRejectionDTO ordersRejectionDTO);

    /**
     * 商家取消订单
     * @param orders 要取消的订单Id和订单取消原因
     */
    void adminCancelOrder(Orders orders);

    /**
     * 派送订单
     * @param orderId 要派送的订单Id
     */
    void deliveryOrder(Long orderId);

    /**
     * 完成订单
     * @param orderId 要完成订单Id
     */
    void completeOrder(Long orderId);

    /**
     * 用户催单
     * @param orderId 订单Id
     */
    void reminderOrder(Long orderId);
}
